package main

import "fmt"

func main() {
	/*
		切片 slice：
			1.每一个切片引用了一个底层数组
			2.切片本身并不存储任何数据，都是这个底层数组存储，所以修改切片也就是修改这个数组中的数据
			3.当向切片中添加数据时，如果没有超过容量，直接添加，如果超过容量，自动扩展(成倍增长)
			4.切片一旦扩容，就是重新指向一个新的底层函数
			5.切片的本质就是对底层数组的封装，它包含了三个信息：底层数组指针、切片长度、切片的容量

			s1:3——>6——>12——>24——>...
			s2:4——>8——>16——>32——>...
	*/
	s1 := []int{1, 2, 3}
	fmt.Println(s1)
	fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) //len: 3, cap: 3
	fmt.Printf("%p\n", s1)                             //0xc0000aa078
	// 注意：获取底层数组的地址时，不能加'&'，因为切片是引用类型的结构，加上’&‘就取的是切片本身的地址了

	s1 = append(s1, 4, 5)
	fmt.Println(s1)
	fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) //len: 5, cap: 6
	fmt.Printf("%p\n", s1)                             //0xc0000c8030

	s1 = append(s1, 3, 4)
	fmt.Println(s1)
	fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) //len: 7, cap: 12
	fmt.Printf("%p\n", s1)                             //0xc00006e060

	s1 = append(s1, 7)
	fmt.Println(s1)
	fmt.Printf("len: %d, cap: %d\n", len(s1), cap(s1)) //len: 8, cap: 12
	fmt.Printf("%p\n", s1)                             //0xc00006e060

}
